package manejoDB;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author carlos
 */
public class ConexionDB {

    private String usuario;
    private String clave;
    private String url;
    private String driverClassName;
    private Connection conn = null;
    private Statement estancia;

    public ConexionDB() {
        //poner los datos apropiados
        this.usuario = "postgres";
        //TODO: Actualizar demas versiones con "palmera"
        this.clave = "palmera";
        //this.url = "jdbc:postgresql://localhost:5432/SistLavanderiaDB";
        this.url = "jdbc:postgresql://localhost:5432/postgres";
        this.driverClassName = "org.postgresql.Driver";
    }

//la conexion propiamente dicha
    public Boolean conectar() throws SQLException {
        boolean conectado;
        try {
            Class.forName(this.driverClassName).newInstance();
            this.conn = DriverManager.getConnection(this.url, this.usuario, this.clave);
            conectado = true;
        } catch (Exception err) {
            System.out.println("Error " + err.getMessage());
            conectado = false;
        }
        return conectado;
        
    }
    //Cerrar la conexion

    public void cierraConexion() throws SQLException {
        this.conn.close();
    }

    
    //Usado Mucho
    ResultSet consulta(String consulta) throws SQLException {
        this.estancia = (Statement) conn.createStatement();
        ResultSet resultado = this.estancia.executeQuery(consulta);
        return resultado;
    }

    void actualizar(String actualiza) throws SQLException {
        this.estancia = (Statement) conn.createStatement();
        estancia.executeUpdate(actualiza);
    }

    ResultSet borrar(String borra) throws SQLException {
        Statement st = (Statement) this.conn.createStatement();
        return (ResultSet) st.executeQuery(borra);
    }

    void insertar(String inserta) throws SQLException {
        Statement st = (Statement) this.conn.createStatement();
        st.execute(inserta);
    }
    

    private void crearTablas() {
        try {
            Statement statement = null;
            statement = (Statement) conn.createStatement();
            
            String tablaCliente = "CREATE TABLE IF NOT EXISTS Cliente(idCliente SERIAL NOT NULL PRIMARY KEY,"
                    + "nombre varchar(50),apellido varchar(50), calle varchar(50), nrocalle varchar (10),"
                    + "localidad varchar (50), codigoPostal varchar (10), pisonro varchar(10), telefono varchar(15),"
                    + "celular varchar(15),eliminado boolean);";
            
            String tablaOrden = "CREATE TABLE IF NOT EXISTS Orden(idOrden SERIAL NOT NULL PRIMARY KEY,"
                    + "idCliente integer NOT NULL references Cliente(idCliente),fechaPedido varchar(20), fechaEntrega varchar(20),"
                    + "fechaPactada varchar(20), horaPactadaDesde varchar(15), horaPactadaHasta varchar(15), estadoOrden varchar(15), "
                    + "montoTotal double precision, montoAbonado double precision, montoAdeudado double precision,delivery boolean,"
                    + "lugarDeAlmacenajePedidoListo varchar(100), fechaOrdenRealizada varchar(20), horaPedido varchar(10),"
                    + "descuento double precision, observaciones varchar(50), horaEntrega varchar(10),horaOrdenRealizada varchar(10));";
            
            String tablaServicio = "CREATE TABLE IF NOT EXISTS Servicio(idServicio SERIAL NOT NULL PRIMARY KEY,"
                    + "nombre varchar(50), precio double precision, tercerizado boolean,"
                    + "precioProveedor double precision ,tipo varchar(50),eliminado boolean);";
            
/*          
 *          String tablaServicioEspecial="CREATE TABLE IF NOT EXISTS ServicioEspecial"
                    + "(idServEsp SERIAL NOT NULL PRIMARY KEY, idOrden integer NOT NULL references Orden(idOrden),"
                    + "servicioEspecial varchar(100),precioServicioEspecial double precision,cantServEspecial int);";
*/
            String tablaServicioOrden = "CREATE TABLE IF NOT EXISTS ServicioOrden("
                    + "idOrden integer NOT NULL references Orden(idOrden),"
                    + "idServicio integer NOT NULL references Servicio(idServicio), "
                    + "PRIMARY KEY(idOrden,idServicio), precioServicio "
                    + "double precision,cantidad int,costoT double precision);";
            
            String tablaServicioEspOrden="CREATE TABLE IF NOT EXISTS ServicioEspecialOrden"
                    + "(idOrden integer NOT NULL references Orden(idOrden),idServicioEsp SERIAL NOT NULL, PRIMARY KEY(idOrden,idServicioEsp), "
                    + "nombre varchar(50),tipoServEsp varchar(50),precioServicio double precision,cantidad int);";
            
            
            String tablaStock="CREATE TABLE IF NOT EXISTS Stock"
                    + "(idStock SERIAL NOT NULL PRIMARY KEY, nombre varchar(50), cantidad int);";
            
            String tablaIngresoStock="CREATE TABLE IF NOT EXISTS Ingreso"
                    + "(idIngreso SERIAL NOT NULL PRIMARY KEY, fecha varchar(20), precioTotal double precision);";
            
            String tablaIngresoProducto="CREATE TABLE IF NOT EXISTS IngresoProducto"
                    + "(idProducto int NOT NULL references Stock(idStock), idIngresoStock integer NOT NULL references Ingreso(idIngreso), "
                    + "PRIMARY KEY(idProducto,idIngresoStock), precioUnitario double precision, cantidad int);";
            
            String tablaEgresoProducto="CREATE TABLE IF NOT EXISTS EgresoProducto"
                    + "(idEgreso SERIAL NOT NULL PRIMARY KEY, idProducto int NOT NULL references Stock(idStock), fecha varchar(20), cantidad int);";
            
            statement.execute(tablaCliente);
            statement.execute(tablaOrden);
            statement.execute(tablaServicio);
            statement.execute(tablaServicioOrden);
            statement.execute(tablaServicioEspOrden);
            statement.execute(tablaStock);
            statement.execute(tablaIngresoStock);
            statement.execute(tablaIngresoProducto);
            statement.execute(tablaEgresoProducto);
        } catch (SQLException ex) {
            Logger.getLogger(ConexionDB.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

public static void main (String [] args ){
        ConexionDB cdb= new ConexionDB();
        try {
            if(cdb.conectar()){
                cdb.crearTablas();
            }
        } catch (SQLException ex) {
            Logger.getLogger(ConexionDB.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
}
